﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Input;
using System.IO;
using System.Xml;

namespace BoxGame.Core
{
    /// <summary>
    /// Diese Klasse kennt die Steuerungs-Konfiguration,
    /// die der Spieler eingestellt hat, und stellt sie
    /// als Microsoft.Xna.Framework.Input.Keys zur Verfügung.
    /// Die Tastenbelegung kann in einer XML Datei
    /// gespeichert und aus dieser geladen werden.
    /// </summary>
    class Steuerung
    {
        // In diesen Dingern wird die Tastenbelegung
        // für die vier Richtungen gespeichert.
        public Keys linksrum;
        public Keys rechtsrum;
        public Keys vorwaerts;
        public Keys rueckwaerts;
        public Keys linksschritt;
        public Keys rechtsschritt;

        /// <summary>
        /// Laed die Tastenbelegung aus der XML Datei.
        /// </summary>
        public Steuerung()
        {
            this.Laden();
        }


        /// <summary>
        /// Erstellt das Ding mit angegebenen
        /// Parametern fuer die Tastenbelegung.
        /// </summary>
        /// <param name="steuL">Nach links drehen</param>
        /// <param name="steuR">Nach rechts drehen</param>
        /// <param name="steuV">Vorwaerts bewegen</param>
        /// <param name="steuR">Rueckwaerts bewegen</param>
        public Steuerung(Keys steuL, Keys steuRe, Keys steuV, Keys steuR, Keys steuLS, Keys steuRS)
        {
            linksrum = steuL;
            rechtsrum = steuRe;
            vorwaerts = steuV;
            rueckwaerts = steuR;
            linksschritt = steuLS;
            rechtsschritt = steuRS;
        }

        /// <summary>
        /// Prueft ob XML Datei existiert.
        /// Falls ja: Datei laden, Tastenbelegung zuweisen und true zurueckgeben.
        /// Falls nein: False zurueck geben.
        /// WICHTIG: Falls Datei nicht geladen werden kann, wird "none" zugewiesen.
        /// </summary>
        public bool Laden()
        {
            // Zwischenvariablen fuer die Tasten als string anlegen.
            string zwischenlinks;
            string zwischenrechts;
            string zwischenvor;
            string zwischenrueck;
            string zwischenRS;
            string zwischenLS;

            // Erstellen von Variablen für die ini Datei und den Pfad zu ihr.
            // Die XML Datei soll aus %appdata%\BoxGame geladen werden.
            var fileName = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BoxGame\\Options.xml";

            // Pruefen ob die Datei überhaupt existiert.
            if (System.IO.File.Exists(fileName))
            {
                // Tastenbelegung aus Datei lesen.
                // TODO: Was, wenn die Datei Murks ist?
                XmlReader dateiLeser = XmlReader.Create(@fileName);
                dateiLeser.ReadToFollowing("left");
                zwischenlinks = dateiLeser.ReadString();
                dateiLeser.ReadToFollowing("right");
                zwischenrechts = dateiLeser.ReadString();
                dateiLeser.ReadToFollowing("forward");
                zwischenvor = dateiLeser.ReadString();
                dateiLeser.ReadToFollowing("backward");
                zwischenrueck = dateiLeser.ReadString();
                dateiLeser.ReadToFollowing("moveleft");
                zwischenLS = dateiLeser.ReadString();
                dateiLeser.ReadToFollowing("moveright");
                zwischenRS = dateiLeser.ReadString();
                dateiLeser.Close();

                // Umwandeln der String Variablen in Input.Keys.
                // TODO: Was, wenn jemand Unsinn eingetragen hat?
                linksrum = (Keys)Enum.Parse(linksrum.GetType(), zwischenlinks, true);
                rechtsrum = (Keys)Enum.Parse(rechtsrum.GetType(), zwischenrechts, true);
                vorwaerts = (Keys)Enum.Parse(vorwaerts.GetType(), zwischenvor, true);
                rueckwaerts = (Keys)Enum.Parse(rueckwaerts.GetType(), zwischenrueck, true);
                return true;
            }
            else
            {
                // Nix machen da Datei nich existiert, und false zurueck geben.
                return false;
            }
        }

        /// <summary>
        ///  Speichert die Tastenbelegung in XML Datei.
        /// </summary>
        public void Speichern()
        {
            // Erstellen von Variablen für die ini Datei und den Pfad zu ihr.
            // Die ini Datei soll in %appdata%\BoxGame gespeichert werden.
            var filePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BoxGame";
            var fileName = filePath + "\\Options.xml";

            // Pruefen ob der %appdata%\BoxGame Ordner existiert und und wenn nicht, erstellen.
            if (!System.IO.Directory.Exists(filePath))
            {
                System.IO.Directory.CreateDirectory(filePath);
            }

            // XML Settings Objekt erstellen und einstellen.
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = "  ";

            // XML Writer erstellen und Datein in Datei schreiben.
            // Dabei die XML Einstellungen aus dem settings objekt nutzen.
            XmlWriter writer = XmlWriter.Create(@fileName, settings);
            writer.WriteStartDocument();
            writer.WriteStartElement("options");
            writer.WriteStartElement("keyboard");
            writer.WriteElementString("left", linksrum.ToString());
            writer.WriteElementString("right", rechtsrum.ToString());
            writer.WriteElementString("forward", vorwaerts.ToString());
            writer.WriteElementString("backward", rueckwaerts.ToString());
            writer.WriteElementString("moveleft", linksschritt.ToString());
            writer.WriteElementString("moveright", rechtsschritt.ToString());
            writer.WriteEndElement(); // </keyboard>
            writer.WriteEndElement(); // </options>
            writer.WriteEndDocument();
            writer.Close();
        }
    }
}
